package com.prezs.Javaio;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.security.cert.CertificateFactorySpi;

public class ReaderAndWriter {
	
	/**
	 * <h4> 每次读取一个字符
	 * @throws IOException
	 */
	public static void readOneChar() throws IOException {
		// 使用文件名创建FileReader对象，读入文件数据
//		FileReader fr =  new FileReader("test.txt");
		// 使用File对象创建FileReader对象，读入文件数据
		File file = new File("input.txt");
		FileReader fr =  new FileReader(file);
		
		// 定义存储数据的变量
		int c;
		
		// 从输入流中读取数据并打印到控制台
		while((c = fr.read()) != -1) {
			System.out.println((char)c);
		}
		
		// 关闭字符输入流
		fr.close();
	}
	
	/**
	 * <h4> 读取指定长度的字符
	 * @throws IOException
	 */
	public static void readSpecificLenChar() throws IOException {
		// 创建字符流对象，读入数据
		FileReader fr =  new FileReader("input.txt");
		
		// 存储字符的字符数组
		char[] charArr = new char[1024];
//		System.out.println(charArr.length);
		
		// 读取字符的中点位置
		int len;
		
		// 循环读取数据
		while((len = fr.read(charArr, 0, charArr.length)) != -1) {
			// 每次读取len个字符，就将其转换为字符串并输出
			System.out.print(new String(charArr, 0, len));
		}
		
		// 关闭字符流
		fr.close();
	}
	
	private static FileWriter fw = null;
	/**
	 * <h4> 每次向文件中写入一个字符
	 * <hr>
	 * <ul> 注意：
	 * 	<li> {@link FileWriter}的write(int c)方法来自于父类 {@link OutputStreamWriter}
	 * 	     ,因此从根本上说每次写入的是一个字节
	 */
	public static void writeOneChar() {
		try {
		 fw = new FileWriter("output.txt");
		 // 向文件写入hello
		 fw.write(72); // 字符H的ASCII码
		 fw.write(101);
		 fw.write(108);
		 fw.write(108);
		 fw.write(111);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}		
			
	}
	/**
	 * <h3> 向文件中写入字符
	 * <hr>
	 * <ul> 注意：
	 * 	<li> 在使用fw.write(chars,0,6)方法时,包括左边界0，不包括右边界6
	 */
	public static void writeChars() {
		try {
			fw = new FileWriter("output.txt");
			// 写入字符数组
//			char[] chars = {'W','o','r','l','d'};
//			fw.write(chars);
			
			// 写入指定的字符
			char[] chars = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
			fw.write(chars,0,6);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if (fw != null) {
					fw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) throws IOException {
		readOneChar();
		
		readSpecificLenChar();
		
		writeOneChar();
		
		writeChars();
	}
}
